package com.yidu.action;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yidu.common.JsonMsg;
import com.yidu.common.Message;
import com.yidu.common.Pages;
import com.yidu.common.Tools;
import com.yidu.domain.ListenBackstageUser;
import com.yidu.domain.ListenFinance;
import com.yidu.domain.ListenFinanceDetail;
import com.yidu.domain.ListenPurchase;
import com.yidu.domain.ListenReturnGoods;
import com.yidu.domain.ListenReturnGoodsDetail;
import com.yidu.domain.ListenSell;
import com.yidu.domain.ListenSellDetail;
import com.yidu.domain.ListenStock;
import com.yidu.domain.ListenStockRecord;
import com.yidu.service.ListenFinanceDetailService;
import com.yidu.service.ListenFinanceService;
import com.yidu.service.ListenReturnGoodsDetailService;
import com.yidu.service.ListenReturnGoodsService;
import com.yidu.service.ListenSellService;
import com.yidu.service.ListenStockRecordService;
import com.yidu.service.ListenStockService;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author wujie
 * @since 2018-11-27
 */
@Controller
@RequestMapping("/listenReturnGoods")
public class ListenReturnGoodsController {
	
	/**
	 * 注入退货service服务类
	 */
	@Resource
	ListenReturnGoodsService goodsService;
	/**
	 * 注入销售service服务类
	 */
	@Resource
	ListenSellService listenSellService;
	/**
	 * 注入退货明细service服务类
	 */
	@Resource
	ListenReturnGoodsDetailService goodsDetailService;
	/**
	 * 注入库存service服务类
	 */
	@Resource
	ListenStockService listenStockService ;
	/**
	 * 注入库存记录service服务类
	 */
	@Resource
	ListenStockRecordService recordService;
	/**
	 * 注入财务service服务类
	 */
	@Resource
	ListenFinanceService financeService;
	/**
	 * 注入财务明细service服务类
	 */
	@Resource
	ListenFinanceDetailService detailService ;
	/**
	 * 查询销售记录
	 * 
	 * @param listenSell
	 *            销售类对象
	 * @return
	 */
	@RequestMapping("selectReturn")
	@ResponseBody
	public Map<String, Object> selectAll(ListenSell listenSell , HttpSession session) {
		ListenBackstageUser user = (ListenBackstageUser) session.getAttribute("user");
		// 获取map集合
		Map<String, Object> map = new HashMap<>();
		// 判断销售订单ID是否为空
		if (!Tools.isEmpty(listenSell.getSellId())) {
			// 给map集合赋值
			map.put("sellId", listenSell.getSellId());
		}
		// 判断操作人是否为空
		if (!Tools.isEmpty(listenSell.getOper())) {
			// 给map集合赋值
			map.put("oper", listenSell.getOper());
		}
		// 给map集合赋值
		map.put("sellTarget", user.getSite());
		// 判断开始时间是否为空
		if (listenSell.getStartTime() != null && !"".equals(listenSell.getStartTime())) {
			// 给map集合赋值
			map.put("startTime", listenSell.getStartTime() + " 00:00:00");
		}
		// 判断结束时间是否为空
		if (listenSell.getEndTime() != null && !"".equals(listenSell.getEndTime())) {
			// 给map集合赋值
			map.put("endTime", listenSell.getEndTime() + " 23:59:59");
		}
		// 如果page不为空
		if (listenSell.getPage() != null && listenSell.getLimit() != null) {
			// 创建一个page对象
			Pages page = new Pages();
			// 给curPage赋值
			page.setCurPage(listenSell.getPage());
			// 给MaxResult赋值
			page.setMaxResult(listenSell.getLimit());
			// 添加到Map集合中
			map.put("firstRows", page.getFirstRows());
			map.put("maxResult", page.getMaxResult());
		}

		// 查询所有的到一个销售集合
		List<ListenSell> list = listenSellService.selectReturn(map);
		// 查询总行数
		int rows = listenSellService.selectReturnCount(map);

		// 得到一个新的map集合
		Map<String, Object> layuiMap = new HashMap<>();
		// 给map集合赋值
		layuiMap.put("code", 0);
		layuiMap.put("msg", "");
		layuiMap.put("count", rows);
		layuiMap.put("data", list);
		// 返回到前台页面
		return layuiMap;
	}
	
	/**
	 * 销售退货
	 * @param goods
	 * @param session
	 * @return
	 */
	@RequestMapping("salesReturn")
	@ResponseBody
	public JsonMsg salesReturn(ListenReturnGoods goods, HttpSession session) {
		//定义一个字符串接受前台数据
		String str = goods.getReturns();
		//定义number
		Integer number = 0;
		//定义价格
		Double price = 0.0;
		//定义rowes
		int rowes = 0;
		//定义rows
		int rows = 0;
		//按照#号拆分字符串
		String[] gain = str.split("#");
		//遍历组数
		for (int i = 0; i < gain.length; i++) {
			//根据逗号拆分得到一个数组
			String[] gains = gain[i].split(",");
			//将得到的数组的值赋值给number
			number += Integer.valueOf(gains[7]);
			//将得到的数组的值赋值给price
			price += Double.valueOf(gains[8]);
		}
		//设置日期格式
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
		//得到session
		ListenBackstageUser user = (ListenBackstageUser) session.getAttribute("user");
		//得到退货对象
		ListenReturnGoods returnGoods = new ListenReturnGoods();
		//赋值随机数ID给退货ID
		returnGoods.setRgId(Tools.getRandomString(32));
		//赋值销售ID给业务ID
		returnGoods.setVocationalWorkId(goods.getSellId());
		//赋值退货时间
		returnGoods.setRgTime(new Date());
		//赋值退货操作时间
		returnGoods.setOpenTime(new Date());
		//赋值退货数量
		returnGoods.setRgNumber(Integer.valueOf(number));
		//赋值退货价格
		returnGoods.setRgPrice(BigDecimal.valueOf(price));
		//赋值退货公司ID
		returnGoods.setRgPeopleId(user.getSite());
		//设置是否可见
		returnGoods.setIsva(1);
		//赋值操作人
		returnGoods.setOper(user.getBuName());
		//赋值退货状态为1
		returnGoods.setSort("1");
		//添加到退货表
		rows = goodsService.addReturn(returnGoods);
		//如果rows>0
		if (rows > 0) {
			//根据#号拆分str字符串
			String[] strs = str.split("#");
			//遍历组数
			for (int i = 0; i < strs.length; i++) {
				//得到退货明细对象
				ListenReturnGoodsDetail detail = new ListenReturnGoodsDetail();
				//根据逗号拆分得到数组
				String[] stres = strs[i].split(",");
				//设置随机数ID
				detail.setRgdId(Tools.getRandomString(32));
				//赋值给退货明细的退货ID
				detail.setRgId(returnGoods.getRgId());
				//赋值给商品ID
				detail.setSort(stres[1]);
				//赋值给商品ID
				detail.setMuName(stres[2]);
				//赋值给商品类型ID
				detail.setMtName(stres[3]);
				//赋值给商品数量
				detail.setMuNumber(Integer.valueOf(stres[4]));
				//赋值给退货小计
				detail.setSubtotal(BigDecimal.valueOf(Double.valueOf(stres[5])));
				//赋值给说明
				detail.setRgdRemarks("退货");
				//设置是否可见
				detail.setIsva("1");
				//赋值操作时间
				detail.setOpenTime(new Date());
				//赋值操作人
				detail.setOper(user.getBuName());
				//添加到退货明细表
				rowes = goodsDetailService.addDetail(detail);
			}
		}
		JsonMsg msg = new JsonMsg();
		if (rows > 0 && rowes > 0) {
			// 给Json赋值
			msg.setMsg("提交成功，请等待订单审核！");
			msg.setDatas(0);
		} else {
			// 给Json赋值
			msg.setMsg("提交失败，请再次尝试！");
			msg.setDatas(1);
		}
		return msg;
	}
	
	
	@RequestMapping("selectReturnAll")
	@ResponseBody
	public Map<String, Object> selectReturnAll(ListenReturnGoods goods) {
		// 获取map集合
		Map<String, Object> map = new HashMap<>();
		// 判断销售订单ID是否为空
		if (!Tools.isEmpty(goods.getRgId())) {
			// 给map集合赋值
			map.put("rgId", goods.getRgId());
		}
		// 如果page不为空
		if (goods.getPage() != null && goods.getLimit() != null) {
			// 创建一个page对象
			Pages page = new Pages();
			// 给curPage赋值
			page.setCurPage(goods.getPage());
			// 给MaxResult赋值
			page.setMaxResult(goods.getLimit());
			// 添加到Map集合中
			map.put("firstRows", page.getFirstRows());
			map.put("maxResult", page.getMaxResult());
		}

		// 查询所有的到一个销售集合
		List<ListenReturnGoods> list = goodsService.selectReturnAll(map);
		// 查询总行数
		int rows = goodsService.selectReturnCount(map);

		// 得到一个新的map集合
		Map<String, Object> layuiMap = new HashMap<>();
		// 给map集合赋值
		layuiMap.put("code", 0);
		layuiMap.put("msg", "");
		layuiMap.put("count", rows);
		layuiMap.put("data", list);
		// 返回到前台页面
		return layuiMap;
	}
	
	/**
	 * 修改退货状态
	 * @param goods
	 * @param session
	 * @return
	 */
	@RequestMapping("updateState")
	@ResponseBody
	public JsonMsg updateState(ListenReturnGoods goods, HttpSession session) {
		//得到session
		ListenBackstageUser user = (ListenBackstageUser) session.getAttribute("user");
		//赋值给退货人
		goods.setOper(user.getBuName());
		//修改状态
		int rows = goodsService.updateState(goods);
		
		JsonMsg msg = new JsonMsg();
		if (rows > 0 ) {
			//添加总公司库存，减少金额
			AddStockMinusMoney(goods,session);
			//减少分公司库存，添加金额
			MinusStockAddMoney(goods,session);
			msg.setMsg("提交成功，请等待订单审核！");
			// 给Json赋值
			msg.setDatas(0);
		} else {
			// 给Json赋值
			msg.setMsg("提交失败，请再次尝试！");
			msg.setDatas(1);
		}
		return msg;
	};
	
	/**
	 * 修改退货状态
	 * @param goods
	 * @param session
	 * @return
	 */
	@RequestMapping("updateStates")
	@ResponseBody
	public JsonMsg updateStates(ListenReturnGoods goods, HttpSession session) {
		//得到session
		ListenBackstageUser user = (ListenBackstageUser) session.getAttribute("user");
		//赋值给操作人
		goods.setOper(user.getBuName());
		//修改状态
		int rows = goodsService.updateState(goods);
		
		JsonMsg msg = new JsonMsg();
		if (rows > 0 ) {
			// 给Json赋值
			msg.setMsg("提交成功，请等待订单审核！");
			msg.setDatas(0);
		} else {
			// 给Json赋值
			msg.setMsg("提交失败，请再次尝试！");
			msg.setDatas(1);
		}
		return msg;
	};
	
	/**
	 * 添加总公司库存减少财务
	 * 
	 * @param listenSell
	 */
	public void AddStockMinusMoney(ListenReturnGoods goods ,HttpSession session) {
		// 通过销售ID查询的到一个List集合
		List<ListenReturnGoodsDetail> list = goodsDetailService.findByDetails(goods.getRgId());
		ListenBackstageUser user = (ListenBackstageUser) session.getAttribute("user");
		// 遍历List集合得到销售明细对象
		for (ListenReturnGoodsDetail listenReturnGoodsDetail : list) {
			// 创建一个库存对象
			ListenStock stock = new ListenStock();
			// 给库存商品ID赋值
			if(listenReturnGoodsDetail.getSort()!=null && !"".equals(listenReturnGoodsDetail.getSort())) {
				stock.setMuId(listenReturnGoodsDetail.getSort());
			}
			// 给库存公司ID赋值
			stock.setCompanyId("1");
			// 给库存数量赋值
			stock.setStockNumber(listenReturnGoodsDetail.getMuNumber());
			// 将库存对象传入修改方法
			listenSellService.updateAddNumber(stock);
			 
			//得到库存记录表
			ListenStockRecord record = new ListenStockRecord();
			//根据库存对象查询库存
			List<ListenStock> stockList = listenStockService.findById(stock);
			//遍历集合
			for (ListenStock listenStock : stockList) {
				//设置库存记录随机数ID
				record.setSrId(Tools.getRandomString(32));
				//设置库存ID
				record.setStockId(listenStock.getStockId());
				//设置商品名称
				record.setMuName(listenReturnGoodsDetail.getMuName());
				//设置记录时间
				record.setSrTime(new Date());
				//设置操作时间
				record.setOpenTime(new Date());
				//设置记录数量
				record.setSrNumber(listenReturnGoodsDetail.getMuNumber());
				//设置操作说明
				record.setSrExplain("分公司退货，入库");
				//设置是否可见
				record.setIsva(1);
				//设置操作人
				record.setOper(user.getBuName());
			}
			//添加到库存记录表
			recordService.insertSelective(record);
			// 得到财务对象
			ListenFinance finance = new ListenFinance();
			// 给财务公司Id赋值
			finance.setCompanyId("1");
			// 给财务公司金额赋值
			finance.setCompanyPrice(listenReturnGoodsDetail.getSubtotal());
			// 将财务对象传入修改方法
			listenSellService.updateMinusMoney(finance);
			
			//创建一个财务明细表对象
			ListenFinanceDetail detail = new ListenFinanceDetail();
			//根据公司ID查询得到集合
			List<ListenFinance> financeList = financeService.findByIds(listenReturnGoodsDetail.getCompanyId());
			//遍历集合
			for (ListenFinance listenFinance : financeList) {
				//设置随机数
				detail.setFdId(Tools.getRandomString(32));
				//赋值财务ID
				detail.setFinanceId(listenFinance.getFinanceId());
				//赋值明细时间
				detail.setFdTime(new Date());
				//赋值给操作时间
				detail.setOpenTime(new Date());
				//赋值给财务金额
				detail.setFdPrice(listenReturnGoodsDetail.getSubtotal());
				//从退货对象里得到ID赋值给业务ID
				detail.setVocationalWorkId(goods.getRgId());
				//赋值给财务数量
				detail.setFdNumber(listenReturnGoodsDetail.getMuNumber());
				//设置是否可见
				detail.setIsva(1);
				//赋值操作人
				detail.setOper(user.getBuName());
				//赋值操作说明
				detail.setSort("支出，分公司退货");
			}
			//添加到财务明细表
			detailService.insertSelective(detail);
		}
	}

	/**
	 * 分公司财务增加库存减少
	 * 
	 * @param listenSell
	 */
	public void MinusStockAddMoney(ListenReturnGoods goods ,HttpSession session) {
		// 通过销售ID查询的到一个List集合
		List<ListenReturnGoodsDetail> list = goodsDetailService.findByDetails(goods.getRgId());
		// 得到session，获取当前登录的用户对象
		ListenBackstageUser user = (ListenBackstageUser) session.getAttribute("user");
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
		// 遍历List集合得到销售明细对象
		for (ListenReturnGoodsDetail listenReturnGoodsDetail : list) {
			// 创建一个库存对象
			ListenStock stock = new ListenStock();
			// 给库存商品ID赋值
			if (listenReturnGoodsDetail.getSort() != null && !"".equals(listenReturnGoodsDetail.getSort())) {
				stock.setMuId(listenReturnGoodsDetail.getSort());
			}
			// 给库存公司ID赋值
			stock.setCompanyId(listenReturnGoodsDetail.getCompanyId());
			// 给库存数量赋值
			stock.setStockNumber(listenReturnGoodsDetail.getMuNumber());
			// 将库存对象传入修改方法
			listenSellService.updateMinusNumber(stock);
			
			//得到记录对象
			ListenStockRecord record = new ListenStockRecord();
			
			//根据库存对象查询的到集合
			List<ListenStock> stockList = listenStockService.findById(stock);
			//遍历集合
			for (ListenStock listenStock : stockList) {
				//设置库存记录随机数ID
				record.setSrId(Tools.getRandomString(32));
				//设置库存ID
				record.setStockId(listenStock.getStockId());
				//设置商品名称
				record.setMuName(listenReturnGoodsDetail.getMuName());
				//设置记录时间
				record.setSrTime(new Date());
				//设置操作时间
				record.setOpenTime(new Date());
				//设置记录数量
				record.setSrNumber(listenReturnGoodsDetail.getMuNumber());
				//设置操作说明
				record.setSrExplain("分公司退货，出库");
				//设置是否可见
				record.setIsva(1);
				//设置操作人
				record.setOper(user.getBuName());
			}
			recordService.insertSelective(record);
			// 得到财务对象
			ListenFinance finance = new ListenFinance();
			// 给财务公司Id赋值
			finance.setCompanyId(listenReturnGoodsDetail.getCompanyId());
			// 给财务公司金额赋值
			finance.setCompanyPrice(listenReturnGoodsDetail.getSubtotal());
			// 将财务对象传入修改方法
			listenSellService.updateAddMoney(finance);
			//得到财务明细对象
			ListenFinanceDetail detail = new ListenFinanceDetail();
			//根据明细对象里的公司ID查询的到集合
			List<ListenFinance> financeList = financeService.findByIds(listenReturnGoodsDetail.getCompanyId());
			//遍历集合
			for (ListenFinance listenFinance : financeList) {
				//设置随机数
				detail.setFdId(Tools.getRandomString(32));
				//赋值财务ID
				detail.setFinanceId(listenFinance.getFinanceId());
				//赋值明细时间
				detail.setFdTime(new Date());
				//赋值给操作时间
				detail.setOpenTime(new Date());
				//赋值给财务金额
				detail.setFdPrice(listenReturnGoodsDetail.getSubtotal());
				//从退货对象里得到ID赋值给业务ID
				detail.setVocationalWorkId(goods.getRgId());
				//赋值给财务数量
				detail.setFdNumber(listenReturnGoodsDetail.getMuNumber());
				//设置是否可见
				detail.setIsva(1);
				//赋值操作人
				detail.setOper(user.getBuName());
				//赋值操作说明
				detail.setSort("收入，分公司退货");
			}
			//添加到财务明细表
			detailService.insertSelective(detail);
		}
	}
}

